﻿#pragma once
#include "DLL.h"
#include <stddef.h>
#include "Singleton.h"
#include <allegro5\allegro.h>
#include <allegro5\allegro_primitives.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include <allegro5\allegro_audio.h>
#include <allegro5\allegro_acodec.h>
#include <iostream>
namespace DarkStorm2D {
	//! Zawiera stałe do wyszukiwania w tablicy inicjalizacji.
	enum DLLDARKSTORM2D EInitItem {
		//! Inicjalizacja Allegro.
		FLAG_ALLEGRO_INIT,
		//! Inicjalizacja iio_addon.
		FLAG_ALLEGRO_IIO_ADDON,
		FLAG_ALLEGRO_PRIMITIVES_ADDON,
		FLAG_ALLEGRO_FONT_ADDON,
		FLAG_ALLEGRO_TTF_ADDON,
		//! Instalacja klawiatury.
		FLAG_ALLEGRO_INSTALL_KEYBOARD,
		//! Instalacja myszki.
		FLAG_ALLEGRO_INSTALL_MOUSE,
		//! Instalacja joystika.
		FLAG_ALLEGRO_INSTALL_JOYSTICK,
		FLAG_ALLEGRO_INSTALL_AUDIO,
		FLAG_ALLEGRO_INIT_ACODEC_ADDON,
		//...
		//! Liczba elementów inicjalizacji lub instalacji.
		NUMBER_INIT_ITEM 
	};

	//! Klasa typu singleton przechowuje informacje na temat Allegro.
	/*! 
	 * Informacje o inicjalizacji, instalacji poszczególnych elementów Allegro.
	 * Klasy nie należy używać na zewnątrz silnika!!!
	 */
	class DLLDARKSTORM2D CSAllegroController : public Singleton<CSAllegroController>
	{
	private:
		//! Tablica zawierająca informacje o stanie incjalizacji poszczególnych elementów Allegro.
		static bool m_InitTable[NUMBER_INIT_ITEM];

		/*! Zmienia stan inicjalizacji.
		 * @param FlagInit Flaga na element który ma zostać zmieniony.
		 * @param action true - inicjuje, false - niszczy.
		 * @return true - jeśli operacja się powiodła false - jeśli nie.
		 */
 		static bool SetInit(int FlagInit, bool action);

	public:
		//! Zeruje tablice instalacji i ustawia Singletona.
		CSAllegroController();
		//! Zeruje tablice instalacji i usuwa dane o Singletonie.
		~CSAllegroController();

		/*! Inicjuje wybrany element.
		 * @param FlagInit Element, który chcemy zainicjować.
		 * @return true- jeśli się powiodło(ewentualnie jeśli już zainicjowano) false - błąd.
		 */
		 static bool Init(int FlagInit);

		/*! Od inicjuje wybrany element.
		 * @param FlagInit Element, który chcemy od inicjować.
		 * @return true- jeśli się powiodło(ewentualnie jeśli element ni był zainicjowany) false - błąd.
		 */
		 static bool Uninit(int FlagInit);

		/*! 
		 * @param FlagInit Flaga na element od którego chcemy uzyskać informacje.
		 * @return Informacja o stanie elementu.
		 */
		 static bool GetInit(int FlagInit);

	}; 


};